package cn.lycode.system.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.lycode.common.core.controller.BaseController;
import cn.lycode.common.core.domain.AjaxResult;
import cn.lycode.common.core.domain.model.SelectIdsDTO;
import cn.lycode.system.domain.dto.sysdept.SysDeptAddDTO;
import cn.lycode.system.domain.dto.sysdept.SysDeptUpDTO;
import cn.lycode.system.domain.vo.DeptTreeVO;
import cn.lycode.system.domain.vo.SysDeptVO;
import cn.lycode.system.service.SysDeptService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @description: 部门控制器
 */
@RestController
@RequestMapping("/sys-dept")
@RequiredArgsConstructor
public class SysDeptController extends BaseController {

    private final SysDeptService sysDeptService;

    /**
     * 树形列表查询
     */
    @SaCheckPermission(value = "system:dept:list")
    @GetMapping("/list")
    public AjaxResult<List<SysDeptVO>> list() {
        return AjaxResult.success(sysDeptService.list());
    }

    /**
     * 部门列表选择树
     */
    @GetMapping("/tree")
    public AjaxResult<List<DeptTreeVO>> tree() {
        return AjaxResult.success(sysDeptService.getDeptTree(false));
    }

    /**
     * 添加部门
     */
    @SaCheckPermission(value = "system:dept:add")
    @PostMapping("/add")
    public AjaxResult<Object> add(@RequestBody SysDeptAddDTO dto) {
        return toAjax(sysDeptService.add(dto));
    }

    /**
     * 获取部门详细信息
     */
    @SaCheckPermission(value = "system:dept:info")
    @GetMapping("/info/{id}")
    public AjaxResult<Object> info(@PathVariable Long id) {
        return AjaxResult.success(sysDeptService.info(id));
    }

    /**
     * 更新部门信息
     */
    @SaCheckPermission(value = "system:dept:update")
    @PostMapping("/update")
    public AjaxResult<Object> update(@RequestBody SysDeptUpDTO dto) {
        return toAjax(sysDeptService.update(dto));
    }


    /**
     * 删除部门
     */
    @SaCheckPermission(value = "system:dept:remove")
    @PostMapping("/remove")
    public AjaxResult<Object> remove(@RequestBody SelectIdsDTO dto) {
        if (sysDeptService.hasChildByDeptIds(dto)) {
            return AjaxResult.failed("部门存在子部门,不允许删除");
        }
        if (sysDeptService.checkDeptExistUser(dto)) {
            return AjaxResult.failed("部门存在用户,不允许删除");
        }
//        sysDeptService.checkDeptDataScope(deptId);
        return toAjax(sysDeptService.remove(dto));
    }


}
